/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package view;

/**
 *
 * @author Diana
 */
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import javax.swing.*;
import javax.swing.border.Border;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
import model.Criterio;
import util.Calculos;

public final class Dialogo {

    JDialog d;
    ArrayList<Criterio> criterios;
    JLabel labelPresentacion;
    JPanel panel;
    JTable matriz;
    int metodo = 0;
    public boolean banderaSeleccon = true;
    public static final int TASACION_SIMPLE = 1;
    public static final int MATRIZ_DOMINACION = 3;
    public static final int METODO_ENTROPIA = 4;
    public static final int TASACION_DIRECTA = 2;
    public static final String PRESENTACION_TASACION_SIMPLE = "Valores enteros de 0 a 10";
    public static final String PRESENTACION_MATRIZ_DOMINACION = "";
    public static final String PRESENTACION_METODO_ENTROPIA = "Pesos calculados";
    public static final String PRESENTACION_TASACION_DIRECTA = "Valores de 0 a 1";
    public static boolean permiso = false;
    private int tipoPonderacion = 0;
    private Component[][] componentes;

    public Dialogo(JFrame parent, ArrayList<Criterio> criterios, int tipoPonderacion) {

        this.criterios = criterios;
//        panel = new JPanel(new GridLayout(3, 1));
        panel = new JPanel();
        matriz = new JTable();
        String[] listaCriterios = null;
        this.tipoPonderacion = tipoPonderacion;

        if (tipoPonderacion == TASACION_SIMPLE) {
            labelPresentacion = new JLabel(PRESENTACION_TASACION_SIMPLE);
            metodo = TASACION_SIMPLE;

            listaCriterios = new String[criterios.size()];

            for (int i = 0; i < listaCriterios.length; i++) {
                listaCriterios[i] = criterios.get(i).getNombre();
            }

        } else if (tipoPonderacion == MATRIZ_DOMINACION) {
            labelPresentacion = new JLabel(PRESENTACION_MATRIZ_DOMINACION);
            metodo = MATRIZ_DOMINACION;
        } else if (tipoPonderacion == METODO_ENTROPIA) {
            labelPresentacion = new JLabel(PRESENTACION_METODO_ENTROPIA);
            metodo = METODO_ENTROPIA;

            listaCriterios = new String[criterios.size()];

            for (int i = 0; i < listaCriterios.length; i++) {
                listaCriterios[i] = criterios.get(i).getNombre();
            }

        } else if (tipoPonderacion == TASACION_DIRECTA) {
            labelPresentacion = new JLabel(PRESENTACION_TASACION_DIRECTA);
            metodo = TASACION_DIRECTA;

            listaCriterios = new String[criterios.size()];

            for (int i = 0; i < listaCriterios.length; i++) {
                listaCriterios[i] = criterios.get(i).getNombre();
            }
        }

        JScrollPane scrollpane = null;

        if (tipoPonderacion == TASACION_DIRECTA || tipoPonderacion == TASACION_SIMPLE || tipoPonderacion == METODO_ENTROPIA) {
            matriz.setModel(new javax.swing.table.DefaultTableModel(
                    new Object[][]{},
                    listaCriterios));

            generarFilasMatriz();

            matriz.setPreferredScrollableViewportSize(new Dimension(500, 80));
            scrollpane = new JScrollPane(matriz);
        } else {
            JPanel content = new JPanel(new GridLayout(criterios.size() + 1, criterios.size() + 1));
            componentes = new Component[criterios.size()][criterios.size()];

            content.add(PintarMatriz.obtenerLabelComodin("Criterios"));

            for (Criterio item : criterios) {
                content.add(PintarMatriz.obtenerLabelCriterio(item));
            }

            int contadorCriterios = 0;
            for (Criterio item : criterios) {
                content.add(PintarMatriz.obtenerLabelCriterio(item));

                for (int i = 0; i < criterios.size(); i++) {

                    if (contadorCriterios == i) {
                        JLabel label = PintarMatriz.obtenerLabelComodin("");
                        content.add(label);
                        componentes[contadorCriterios][i] = label;
                    } else if (contadorCriterios > i) {
                        JLabel label = PintarMatriz.obtenerLabelComodin("0");
                        content.add(label);
                        componentes[contadorCriterios][i] = label;
                    } else if (contadorCriterios < i) {
                        final JComboBox comboBox = PintarMatriz.obtenerJComboBoxBinario();
                        comboBox.setSelectedIndex(1);
                        comboBox.setName(contadorCriterios + "-" + i);
                        comboBox.addActionListener(new ActionListener() {

                            @Override
                            public void actionPerformed(ActionEvent e) {
                                modificarPonderacion(comboBox.getName());
                            }
                        });
                        componentes[contadorCriterios][i] = comboBox;
                        content.add(comboBox);
                    }
                }
                contadorCriterios++;
            }

            scrollpane = new JScrollPane(content);
        }

        JButton button = new JButton("OK");
        d = new JDialog(parent);
        panel.add(labelPresentacion);
        panel.add(scrollpane);
        panel.add(button);
        d.getContentPane().add(panel, BorderLayout.CENTER);
        d.setTitle("Tecnica de ponderacion");
        d.setLocationRelativeTo(null);
        d.setModal(true);
        d.pack();
//        d.setSize(600, 200);

        button.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent ae) {

                String validar = validarDatos();

                if (validar.equals("")) {
                    d.dispose();
                } else {
                    JOptionPane.showMessageDialog(null, validar, "¡Problemas a la hora de generar la ponderación!", JOptionPane.ERROR_MESSAGE);
                }
            }
        });
        d.setVisible(true);
    }

    public void modificarPonderacion(String nombre) {
        String[] indices = nombre.split("-");
        JLabel label = (JLabel) componentes[Integer.parseInt(indices[1])][Integer.parseInt(indices[0])];
        JComboBox comboBox = (JComboBox) componentes[Integer.parseInt(indices[0])][Integer.parseInt(indices[1])];
        label.setText(String.valueOf(Math.abs(comboBox.getSelectedIndex() - 1)));
    }

    public ArrayList<Criterio> getCriterios() {
        return criterios;
    }

    public void setCriterios(ArrayList<Criterio> criterios) {
        this.criterios = criterios;
    }

    public String[] getPesos() {

        double[] pesosNumerico = new double[this.criterios.size()];
        String[] pesos = new String[this.criterios.size()];

        if (metodo == TASACION_SIMPLE) {

            double total = 0;
            for (int i = 0; i < pesos.length; i++) {
                String temporal = (String) matriz.getValueAt(0, i);
                if (temporal == null || temporal.equals("")) {
                    return null;
                }

                if (!esDecimal(temporal)) {
                    return null;
                }

                double temporalNumerico = Double.parseDouble(temporal);
                total += temporalNumerico;
                pesosNumerico[i] = temporalNumerico;
            }
            for (int i = 0; i < pesos.length; i++) {
                pesos[i] = String.valueOf(pesosNumerico[i] / total);
            }
        } else if (metodo == MATRIZ_DOMINACION) {

            double[] totalesTemporales = new double[this.criterios.size()];

            for (int i = 0; i < this.criterios.size(); i++) {
                totalesTemporales[i] = 0;
                for (int j = 0; j < criterios.size(); j++) {
                    if (i != j) {

                        String temporal = "";

                        if (i > j) {
                            JLabel label = (JLabel) componentes[i][j];
                            temporal = label.getText();
                            totalesTemporales[i] += Double.parseDouble(temporal);
                        } else {

                            JComboBox comboBox = (JComboBox) componentes[i][j];
                            totalesTemporales[i] += Double.parseDouble((String) comboBox.getSelectedItem());
                        }
                    }
                }
            }

            double total = 0;
            for (int i = 0; i < pesos.length; i++) {
                double temporalNumerico = totalesTemporales[i];
                total += temporalNumerico;
                pesosNumerico[i] = temporalNumerico;
            }
            for (int i = 0; i < pesos.length; i++) {
                pesos[i] = String.valueOf(pesosNumerico[i] / total);
            }

        } else if (metodo == METODO_ENTROPIA) {
            for (int i = 0; i < pesos.length; i++) {
                pesos[i] = String.valueOf(matriz.getValueAt(0, i));
                if (pesos[i] == null || pesos[i].equals("")) {
                    return null;
                }
                if (!esDecimal(pesos[i])) {
                    return null;
                }
            }
        } else if (metodo == TASACION_DIRECTA) {
            for (int i = 0; i < pesos.length; i++) {

                pesos[i] = (String) matriz.getValueAt(0, i);
                if (pesos[i] == null || pesos[i].equals("")) {
                    return null;
                } else {
                    if (!esDecimal(pesos[i])) {
                        return null;
                    }
                }
            }
        }

        return pesos;
    }

    public void generarFilasMatriz() {

        DefaultTableModel temp = (DefaultTableModel) matriz.getModel();
        if (metodo == TASACION_SIMPLE) {
            Object nuevo[] = {""};
            temp.addRow(nuevo);
        } else if (metodo == METODO_ENTROPIA) {
            String[] listaCriterios = new String[criterios.size()];
            Calculos.metodoEntropia();
            ArrayList<Criterio> criteriosTemp = Calculos.getCriterios();

            for (int i = 0; i < listaCriterios.length; i++) {
                listaCriterios[i] = String.valueOf(criteriosTemp.get(i).getPonderacion());
            }
            temp.addRow(listaCriterios);
        } else if (metodo == TASACION_DIRECTA) {
            Object nuevo[] = {""};
            temp.addRow(nuevo);
        }
    }

    public boolean esDecimal(String cad) {

        boolean respuesta = false;
        if (cad != null) {
            try {
                Double.parseDouble(cad);
                respuesta = true;
            } catch (NumberFormatException nfe) {
                respuesta = false;
            }

        } else {
            respuesta = false;
        }

        return respuesta;
    }

    public String validarDatos() {
        String respuesta = "";

        if (tipoPonderacion == TASACION_SIMPLE) {

            for (int i = 0; i < this.criterios.size(); i++) {

                String peso = (String) matriz.getValueAt(0, i);
                if (peso == null || peso.equals("")) {
                    respuesta += "Valor inapropiado en el criterio" + criterios.get(i).getNombre() + "\n";
                } else {
                    if (!esDecimal(peso)) {
                        respuesta += "Valor inapropiado en el criterio" + criterios.get(i).getNombre() + "\n";;
                        return null;
                    }
                }
            }
        } else if (tipoPonderacion == TASACION_DIRECTA) {
            double suma = 0;

            for (int i = 0; i < this.criterios.size(); i++) {

                String peso = (String) matriz.getValueAt(0, i);
                if (peso == null || peso.equals("")) {
                    respuesta += "Valor inapropiado en el criterio" + criterios.get(i).getNombre() + "\n";
                } else {
                    if (!esDecimal(peso)) {
                        respuesta += "Valor inapropiado en el criterio" + criterios.get(i).getNombre() + "\n";;
                        return null;
                    } else {
                        suma += Double.parseDouble(peso);
                    }
                }
            }

            if (suma > 1.1 || suma < 0.9) {
                respuesta += "La suma de las ponderaciones debe ser uno" + "\n";;
            }
        } else if (tipoPonderacion == MATRIZ_DOMINACION) {
        } else if (tipoPonderacion == METODO_ENTROPIA) {
            for (int i = 0; i < this.criterios.size(); i++) {

                String peso = (String) matriz.getValueAt(0, i);
                if (peso == null || peso.equals("")) {
                    respuesta += "Valor inapropiado en el criterio" + criterios.get(i).getNombre() + "\n";
                } else {
                    if (!esDecimal(peso)) {
                        respuesta += "Valor inapropiado en el criterio" + criterios.get(i).getNombre() + "\n";;
                        return null;
                    }
                }
            }
        }
        return respuesta;
    }
}
